#ifndef xpack_macro_xorigin_type
#define xpack_macro_xorigin_type
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::macro_xorigin_type::inc
#include"define/base_type.hpp"
#include"meta/origin_of.hpp"
#pragma pop_macro("xuser")

namespace mixc::macro_xorigin_type{
    using inc::origin_of; // inc 有时可能是个宏，虽然不推荐这么做

    struct __xorigin_type{
        // 需要使用 const &，因为有些类型不能拷贝
        friend auto const & operator + (auto const & value, __xorigin_type){
            return value;
        }

        __xorigin_type & operator +(){
            return *this;
        }

        template<class target_t>
        operator target_t(){ // 不能使用左值引用，因为不能拷贝的类型不支持
            return *(target_t *)this;
        }
    };

    inline __xorigin_type __xorigin_type_sugar;
}

// 此功能作为 decltype 的补充而非替代，参数同时支持值和类型，C++20 decltype(只能是值)
// 工作原理，利用编译器解释方式进行区分，
// 如果 __VA_ARGS__ 是类型，那么 (__VA_ARGS__) +::mixc::macro_xorigin_type::__xorigin_type_sugar 表示的是类型转换
// 如果 __VA_ARGS__ 是值，则该逻辑表示加法操作
#define xorigin_type(...)                                                           \
    ::mixc::macro_xorigin_type::origin_of<                                          \
        decltype((__VA_ARGS__) +::mixc::macro_xorigin_type::__xorigin_type_sugar)   \
    >
#endif
